package com.world.rickcloudendpoint.algorithm;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @description: 空间
 * @author: jlsong
 * @date: 2021/12/27 23:03:00
 * @version: 1.0
 */
public class GisSpace {

    /**
     * 本类唯一对象
     */
    private static GisSpace gisSpace = null;
    /**
     * gis 点信息
     */
    private Map<String, ArrayList<GisPoint>> mGisPoints;

    /**
     * 构造函数
     */
    private GisSpace() {
        mGisPoints = new ConcurrentHashMap<>(new HashMap<>());
    }

    /**
     * 获取本类唯一对象
     *
     * @return
     */
    public static GisSpace getRef() {
        if (gisSpace == null)
            gisSpace = new GisSpace();
        return gisSpace;
    }

    /**
     * 构建gis连接
     *
     * @param gisSet
     */
    public static void connectionGis(ArrayList<GisPoint> gisSet) {
        for (GisPoint gp : gisSet) {
            for (String conId : gp.getIdConnections()) {
                for (GisPoint toGp : gisSet) {
                    if (conId.equals(toGp.getId())) {
                        gp.addConnection(toGp);
                        break;
                    }
                }
            }
        }
    }

    /**
     * 添加GIS信息点
     *
     * @param mapUniqueKey 地图UID
     * @param point        点坐标
     */
    public void addGisPoint(String mapUniqueKey, ArrayList<GisPoint> point) {
        mGisPoints.put(mapUniqueKey, point);
    }

    /**
     * 拷贝一个GIS列表
     *
     * @return
     */
    public ArrayList<GisPoint> cloneGisPoints() {
        ArrayList<GisPoint> ret = new ArrayList<GisPoint>();

        ArrayList<GisPoint> forMapGis = mGisPoints.get("map");
        if (forMapGis != null) {
            for (int i = 0; i < forMapGis.size(); i++) {
                GisPoint oldGP = mGisPoints.get("map").get(i);
                ret.add(oldGP.clone());
            }
        }

        //建立 GIS 连接
        connectionGis(ret);

        return ret;
    }

    /**
     * 清除所有GIS点
     */
    public void clearGisPoint() {
        mGisPoints.clear();
    }


}
